#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<stdbool.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<iostream>
#define command_size 1024
#define format "[%s@%s %s]#"
//下面定义shell的全局变量 
#define maxargc 128
//关于重定向我们关心的内容
#define none_redir 0
#define input_redir 1
#define output_redir 2
#define append_redir 3
int redfilename_redir;
string filename;

char*  my_argv[maxargc];
int argc=0;
const char* getusername()
{
    const char* name=getenv("USER");
    return name==NULL?"None":name;
}
const char* gethostname()
{
    const char* hostname=getenv("HOSTNAME");
    return hostname==NULL?"None":hostname;
}
const char* getpath()
{
    const char* path=getenv("PWD");
    return path==NULL?"None":path;
}
void makecmdline(char cmd_prompt[],int size)
{
    snprintf(cmd_prompt,size,format,getusername(),gethostname(),getpath());   
}
void printcmdprompt()
{
    char prompt[command_size];
    makecmdline(prompt,sizeof(prompt));
    printf("%s ",prompt);
    fflush(stdout);
}
bool getcommandline(char* out,int size)
{    
    char* c=fgets(out,size,stdin);
    if(c==NULL) return false;
    out[strlen(out)-1]=0;
    if(sizeof(out)==0) return false;
    return true;
}
#define dsp " "
bool commandparse(char* commandline)
{
    argc=0;
    my_argv[argc++]=strtok(commandline,dsp); 
    while((bool)(my_argv[argc++]=strtok(NULL,dsp)));
    argc--;
    return true;
}
int execute()
{ 
    pid_t id=fork();
    if(id==0)
    {
        //子进程
        execvp(my_argv[0],my_argv);    
        exit(1);
    }
    pid_t rid=waitpid(id,NULL,0);
    (void)rid;
    return 0;
}
int main()
{
    while(1)
    {
        //输出命令行提示符
        printcmdprompt();
        //获取用户输入的命令
        char commandline[command_size];
        if(!getcommandline(commandline,sizeof(commandline)))
            continue;
        //重定向分析
        
        //命令行分析
        commandparse(commandline);
        //执行命令
        execute();

    }
    return 0;
}
